package servidor.localizacao;

import java.awt.Canvas;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import comum.Localizacao;

/**
 * @author Diego Sanchez Gallo
 */
public class LocalizacaoSimuladaImpl extends JFrame implements ILocalizacao {

    private static final int WINDOW_WIDTH = 800;
    private static final int WINDOW_HEIGHT = 600;

    private JTextField textFieldCaminhoImagem;
    private JTextField textFieldAndar;
    private JTextField textFieldX;
    private JTextField textFieldY;
    
    private double x = 0, y = 0, andar = 0;

    private Canvas canvas;
    private Image imagem;

    public LocalizacaoSimuladaImpl() {
        super();

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        setTitle("Simulador Localizacao");

        // Panel Esquerdo
        JPanel panelEsquerdo = new JPanel();
        panelEsquerdo.setLayout(new BoxLayout(panelEsquerdo, BoxLayout.Y_AXIS));

        canvas = new CanvasImagem();
        canvas.setSize(500, 500);

        JPanel panelEsquerdoInferior = new JPanel();
        panelEsquerdoInferior.setLayout(new BoxLayout(panelEsquerdoInferior, BoxLayout.X_AXIS));
        JLabel labelCaminhoImagem = new JLabel("Imagem: ");
        textFieldCaminhoImagem = new JTextField("Terreo.jpg");
        JButton buttonCarregar = new JButton("OK");
        buttonCarregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                carregarImagem();
            }
        });
        panelEsquerdoInferior.add(labelCaminhoImagem);
        panelEsquerdoInferior.add(textFieldCaminhoImagem);
        panelEsquerdoInferior.add(buttonCarregar);
        panelEsquerdoInferior.setMaximumSize(new Dimension(2000, 100));

        panelEsquerdo.add(canvas);
        panelEsquerdo.add(panelEsquerdoInferior);

        //Panel Direito
        JPanel panelDireito = new JPanel();
        panelDireito.setLayout(new BoxLayout(panelDireito, BoxLayout.Y_AXIS));

        JPanel panelDireitoCentro = new JPanel();
        panelDireitoCentro.setLayout(new BoxLayout(panelDireitoCentro, BoxLayout.Y_AXIS));

        JPanel panelDireitoCentroLocalizacao = new JPanel();
        panelDireitoCentroLocalizacao.setLayout(new GridLayout(3, 2));
        panelDireitoCentroLocalizacao.setBorder(BorderFactory.createCompoundBorder(BorderFactory
                .createTitledBorder("Localiza��o: "), BorderFactory.createEmptyBorder(5, 5, 10, 5)));
        JLabel labelAndar = new JLabel("Andar: ");
        textFieldAndar = new JTextField("0");
        JLabel labelX = new JLabel("X: ");
        textFieldX = new JTextField("0");
        JLabel labelY = new JLabel("Y: ");
        textFieldY = new JTextField("0");
        panelDireitoCentroLocalizacao.add(labelAndar);
        panelDireitoCentroLocalizacao.add(textFieldAndar);
        panelDireitoCentroLocalizacao.add(labelX);
        panelDireitoCentroLocalizacao.add(textFieldX);
        panelDireitoCentroLocalizacao.add(labelY);
        panelDireitoCentroLocalizacao.add(textFieldY);
        panelDireitoCentroLocalizacao.setBorder(BorderFactory.createCompoundBorder(BorderFactory
                .createTitledBorder("Localiza��o: "), BorderFactory.createEmptyBorder(5, 5, 20, 5)));
        panelDireitoCentroLocalizacao.setMaximumSize(new Dimension(250, 100));

//        panelDireitoCentro.add(panelDireitoCentroLocalizacao);
//        panelDireitoCentro.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("V�RTICES"),
//                BorderFactory.createEmptyBorder(5, 5, 0, 5)));
//
//        panelDireito.add(panelDireitoCentro);
//        panelDireito.setBorder(BorderFactory.createTitledBorder("GRAFO"));
//        panelDireito.setMaximumSize(new Dimension(250, 500));

        Container container = getContentPane();
        container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
        container.add(panelEsquerdo);
        container.add(panelDireitoCentroLocalizacao);
        
        this.pack();
        this.setVisible(true);
    }

    public void carregarImagem() {
        File file = new File("/wai2008/GuiaMenos/desenvolvimento/" + textFieldCaminhoImagem.getText());
        try {
            imagem = ImageIO.read(file);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        canvas.repaint();
    }

    public class CanvasImagem extends Canvas implements MouseListener, MouseMotionListener, MouseWheelListener {

        double hmult = 1;
        int xprev = 0;
        int yprev = 0;
        int xpos = 0;
        int ypos = 0;

        public CanvasImagem() {
            addMouseListener(this);
            addMouseMotionListener(this);
            addMouseWheelListener(this);
        }

        public void paint(Graphics graphics) {
            if (imagem != null) {
                graphics.drawImage(imagem, xpos, ypos, (int) (imagem.getWidth(this) * hmult), (int) (imagem
                        .getHeight(this) * hmult), null);
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
         */
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
         */
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
         */
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
         */
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3) {
                textFieldX.setText(String.valueOf((int) ((e.getX() - xpos) / hmult)));
                textFieldY.setText(String.valueOf((int) ((e.getY() - ypos) / hmult)));
            }
            xprev = e.getX();
            yprev = e.getY();
            e.consume();
        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
         */
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
         */
        public void mouseDragged(MouseEvent e) {
            int xMouse = e.getX();
            int yMouse = e.getY();

            xpos += xMouse - xprev;
            ypos += yMouse - yprev;

            xprev = xMouse;
            yprev = yMouse;
            ajustaXPosYPos();
            repaint();
            // System.out.println("posicao (" + xpos + ", " + ypos + ")");
            e.consume();
        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
         */
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.MouseWheelEvent)
         */
        public void mouseWheelMoved(MouseWheelEvent e) {
            if (e.getWheelRotation() > 0) {
                ampliar();
            } else if (e.getWheelRotation() < 0) {
                diminuir();
            }
            e.consume();
        }

        public void ampliar() {
            hmult *= 1.2;
            ajustaXPosYPos();
            repaint();
        }

        public void diminuir() {
            hmult /= 1.2;
            ajustaXPosYPos();
            repaint();
        }

        private void ajustaXPosYPos() {
            int xLimiteMax = imagem.getWidth(this) * hmult > getBounds().getWidth() ? 0
                    : (int) (getBounds().getWidth() - imagem.getWidth(this) * hmult);
            int xLimiteMin = imagem.getWidth(this) * hmult > getBounds().getWidth() ? (int) (getBounds().getWidth() - imagem
                    .getWidth(this)
                    * hmult)
                    : 0;
            int yLimiteMax = imagem.getHeight(this) * hmult > getBounds().getHeight() ? 0 : (int) (getBounds()
                    .getHeight() - imagem.getHeight(this) * hmult);
            int yLimiteMin = imagem.getHeight(this) * hmult > getBounds().getHeight() ? (int) (getBounds().getHeight() - imagem
                    .getHeight(this)
                    * hmult)
                    : 0;

            if (xpos > xLimiteMax)
                xpos = xLimiteMax;
            if (xpos < xLimiteMin)
                xpos = xLimiteMin;
            if (ypos > yLimiteMax)
                ypos = yLimiteMax;
            if (ypos < yLimiteMin)
                ypos = yLimiteMin;

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see servidor.localizacao.ILocalizacao#obterLocalizacao(java.lang.String)
     */
    public Localizacao obterLocalizacao() {
        return new Localizacao(Integer.parseInt(textFieldX.getText()),
                				Integer.parseInt(textFieldY.getText()),
                				Integer.parseInt(textFieldAndar.getText()));
    }

}